空间查询

最后更新时间:2019年6月17日

空间条件查询,即通过设置空间范围条件(即点、矩形、多边形),根据选择图层、范围条件对图层要素进行查询并显示查询结果。通过结果要素可获取其空间信息与属性信息,可根据应用需求解析结果,并选择适合的方式展现。

空间查询分为单点查询、矩形查询、多边形查询,区别只在于构建查询范围对象的方法不同。在此以离线地图查询为例,展示实现方法,在线地图的查询实现与此唯一的区别即是构造查询对象使用的方法不同。

一、 单点查询 Sample详情

1

准备查询图层数据

在明确要查询的数据类型之后,就需要选择对应的、适合的查询范围对象FeatureQuery的构造函数,从而针对需要准备图层数据。在此以离线数据为例,直接指定某一图层为查询目标图层,在实际应用中可以通过当前加载的地图获取其图层信息,以列表方式让用户交互选择某个图层进行查询。

Map map = mapView.getMap();                                  //获取地图对象
int index = map.indexOf("水域");                             //根据图层获取其索引值
VectorLayer vectorLayer= (VectorLayer) map.getLayer(index);  //获取矢量图层

2

构造查询范围对象

构造或获取一个坐标点,作为空间范围,构造查询范围对象。

//坐标点,可利用GraphicPoint将其绘制,便于用户查看位置
Dot dot = new Dot(12730000,3560000);
//创建查询范围对象
QueryBound queryBound=new QueryBound(dot);

3

创建查询对象并设置参数

根据图层数据构造查询对象,然后设置其他参数。

//通过矢量图层创建查询对象
FeatureQuery featureQuery=new FeatureQuery(vectorLayer);
//设置查询空间范围条件
featureQuery.setQueryBound(queryBound);
//设置每页结果数目,默认为10
featureQuery.setPageSize(20);
//设置空间过滤条件(精确相交)
featureQuery.setSpatialFilterRelationship(FeatureQuery.SPATIAL_REL_OVERLAP);

说明:(1)建议每页结果数目设置为较小数目,这样能分解查询任务,提高效率。(2)只有空间查询才需要设置空间过滤条件,并且过滤条件有以下三种,根据需要选择。

字段 作用 说明
FeatureQuery.SPATIAL_REL_CONTAIN 包含 完全包含在查询范围之内的要素才能被查询到
FeatureQuery.SPATIAL_REL_MBROVERLAP 模糊相交 默认方式,与查询范围外包相交、包含的要素能被查询到
FeatureQuery.SPATIAL_REL_OVERLAP 精确相交 最精确,与查询范围精确相交、包含在内的要素能被查询到

4

查询

执行查询操作,并获取查询结果。

//进行要素查询
FeaturePagedResult result = featureQuery.query();
//遍历获取查询结果(可能会有多页)
for (int i=1;i<=result.getPageCount();i++){
    List<Feature> featureList = new ArrayList<Feature>();    //要素集合
    featureList = result.getPage(i);                         //获取页码对应的结果,从1开始计数
    //自定义方法:高亮显示要素图形
    hightLightFeature(featureList);
}

5

结果展示

解析查询返回的结果要素,通过标注、列表等显示展示到界面中。

//自定义方法,绘制查询到的要素图形
private void hightLightFeature(List<Feature> featureList) {
    for (int i = 0; i < featureList.size(); i++) {              //遍历每一页的要素
        Feature feature = featureList.get(i);                   //获取要素对象Feature
        List<Graphic> graphics = feature.toGraphics(true);      //直接将要素转换成图形列表
        mapView.getGraphicsOverlay().addGraphics(graphics);     //绘制图形即高亮显示
        //额外操作:根据需要执行
        //获取要素的属性:键值对的形式
        java.util.Map<String, String> attributes = feature.getAttributes();
        //获取要素的几何对象:可判断要素几何对象类型,进而得到相关信息:长度、面积等
        Geometry geometry = feature.getGeometry();
        //获取要素的几何信息:可获取颜色、填充符号、点大小等等
        GeomInfo geomInfo = feature.getInfo();
    }
    mapView.refresh();   //刷新地图
}

展示效果如下图所示:

点查询.jpg 点查询.jpg


二、 矩形查询 Sample详情

与单点查询不同的就是查询范围对象的设置,根据矩形范围来给定范围。

//构造Rect对象,表示矩形范围
Rect rect= new Rect(12730000,3550000,12780000,3600000);
//构造查询范围对象,并设置给查询对象
QueryBound queryBound=new QueryBound (rect);
featureQuery.setQueryBound(queryBound);

展示效果如下图所示:

矩形查询.png 矩形查询.png


三、 多边形查询 Sample详情

多边形查询则是根据给定的多个点构造查询范围,其它与单点查询相同。

Dot dot1 = new Dot(12700000,3550000);
Dot dot2 = new Dot(12690000,3590000);
Dot dot3 = new Dot(12730000,3620000);
Dot dot4 = new Dot(12780000,3580000);
//构造多点数组:闭合圈
Dot[] dots = {dot1,dot2,dot3,dot4,dot1};
//构造查询范围对象,并设置给查询对象
QueryBound queryBound=new QueryBound (dots);
featureQuery.setQueryBound(queryBound);

展示效果如下图所示:

多边形查询.png 多边形查询.png